package model;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import bean.ArtPendiente;
import bean.Articulo;
import bean.EnvioTienda;
import bean.PendienteFabricacion;
import ejbInterfaces.FacadeBeanRemote;

public class BusinessDelegate implements BusinessDelegateInterface {

	private static BusinessDelegate instance = null;
	private FacadeBeanRemote facadeRemote;

	private BusinessDelegate() {
		init();
	}

	private void init() {
		InitialContext context;
		String naming = "EAP/FacadeBean/remote";
		Hashtable props = new Hashtable();
		props.put(InitialContext.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory");
		// Url completa de ubicacion del servidor de aplicaciones
		props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");
		// Objeto del tipo InitialContext
		try {
			context = new InitialContext(props);
			// Obtencion de referencia del session bean dentro del servidor de
			// aplicaciones
			facadeRemote = (FacadeBeanRemote) context.lookup(naming);
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

	public static BusinessDelegate getInstance() {
		if (instance == null) {
			instance = new BusinessDelegate();
		}
		return instance;
	}

	/*----------------------Alta Articulo-----------------------------*/

	public List<Articulo> obtenerArticulos() {
		ArrayList<Articulo> articulos = null;
		try {
			articulos = (ArrayList<Articulo>) facadeRemote.obtenerArticulos();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return articulos;
	}

	public Articulo obtenerNuevoArticulo() {
		Articulo articulo = null;
		try {
			articulo = facadeRemote.obtenerNuevoArticulo();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return articulo;

	}

	public void guardarNuevoArticulo(Articulo articuloNuevo) {
		try {
			facadeRemote.guardarNuevoArticulo(articuloNuevo);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/*----------------------Sol Dist-----------------------------*/
	public List<ArtPendiente> obtenerArticulosEnviar() {
		List<ArtPendiente> artEnviar = null;
		try {
			artEnviar = facadeRemote.obtenerArticulosAEnviar();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return artEnviar;
	}

	public List<ArtPendiente> obtenerArticulosPendientes() {
		List<ArtPendiente> artPendientes = null;
		try {
			artPendientes = facadeRemote.obtenerArticulosPendientes();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return artPendientes;
	}

	public void updateStockArtEnviar() {
		try {
			facadeRemote.updateStockArtEnviar();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*----------------------Sol Fabr-----------------------------*/
	public ArrayList<PendienteFabricacion> obtenerPendientesFabricacion() {
		ArrayList<PendienteFabricacion> pendientes = null;
		try {
			pendientes = (ArrayList<PendienteFabricacion>) facadeRemote
					.obtenerArticulosPendientesFabricacion();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return pendientes;
	}

	public void generarListaFabricacion(List<PendienteFabricacion> listaFab) {
		try {
			facadeRemote.generarSolFabr(listaFab);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*----------------------Rep AF-----------------------------*/
	public ArrayList<Articulo> obtenerArticulosRecibidos() {
		ArrayList<Articulo> recibidos = null;
		try {
			recibidos = (ArrayList<Articulo>) facadeRemote
					.obtenerArticulosRecibidos();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return recibidos;
	}

	public ArrayList<ArtPendiente> obtenerArticulosPendientesEnvio(
			ArrayList<Articulo> recibidos) {
		ArrayList<ArtPendiente> pendientes = null;
		try {
			pendientes = (ArrayList<ArtPendiente>) facadeRemote
					.obtenerArticulosPendientesEnvio(recibidos);
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return pendientes;
	}

	public void actualizarPedidos(ArrayList<Articulo> updatedArticulos,
			ArrayList<ArtPendiente> updatedPendientes) {
		try {
			facadeRemote.actualizarPedidos(updatedArticulos, updatedPendientes);
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/*----------------------EnvT-----------------------------*/
	public List<EnvioTienda> obtenerEnviosTienda() {
		List<EnvioTienda> enviosTienda = null;

		try {
			enviosTienda = facadeRemote.obtenerEnviosTienda();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return enviosTienda;
	}

	public boolean generarEnviosTiendaXML(List<EnvioTienda> enviosToXML) {
		boolean resultado = false;

		try {
			resultado = facadeRemote.generarEnviosTiendaXML(enviosToXML);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return resultado;
	}

}
